package com.eduplatform.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.eduplatform.dto.AIMaterialGenerateDTO;
import com.eduplatform.dto.MaterialDTO;
import com.eduplatform.entity.Material;
import com.eduplatform.entity.School;
import com.eduplatform.entity.Subject;
import com.eduplatform.entity.User;
import com.eduplatform.mapper.MaterialMapper;
import com.eduplatform.service.MaterialService;
import com.eduplatform.service.SchoolService;
import com.eduplatform.service.SubjectService;
import com.eduplatform.service.UserService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Random;

/**
 * 课件笔记服务实现类
 */
@Service
public class MaterialServiceImpl extends ServiceImpl<MaterialMapper, Material> implements MaterialService {

    @Autowired
    private UserService userService;

    @Autowired
    private SubjectService subjectService;

    @Autowired
    private SchoolService schoolService;

    @Override
    public Page<MaterialDTO> listMaterials(int page, int size, String keyword, Integer type, Integer educationLevel,
            Long subjectId, Long schoolId) {
        Page<Material> materialPage = new Page<>(page, size);
        LambdaQueryWrapper<Material> queryWrapper = new LambdaQueryWrapper<>();

        // 设置查询条件
        queryWrapper.eq(Material::getIsDeleted, 0);

        if (!StringUtils.isEmpty(keyword)) {
            queryWrapper.like(Material::getTitle, keyword);
        }

        if (type != null) {
            queryWrapper.eq(Material::getType, type);
        }

        if (educationLevel != null) {
            queryWrapper.eq(Material::getEducationLevel, educationLevel);
        }

        if (subjectId != null) {
            queryWrapper.eq(Material::getSubjectId, subjectId);
        }

        if (schoolId != null) {
            queryWrapper.and(wrapper -> wrapper.eq(Material::getSchoolId, schoolId).or().isNull(Material::getSchoolId));
        }

        // 按创建时间降序排序
        queryWrapper.orderByDesc(Material::getCreateTime);

        // 分页查询
        Page<Material> result = page(materialPage, queryWrapper);

        // 转换为DTO
        Page<MaterialDTO> dtoPage = new Page<>();
        BeanUtils.copyProperties(result, dtoPage, "records");

        List<MaterialDTO> dtoList = new ArrayList<>();
        for (Material material : result.getRecords()) {
            MaterialDTO dto = new MaterialDTO();
            BeanUtils.copyProperties(material, dto);

            // 设置用户名
            User user = userService.getById(material.getUserId());
            if (user != null) {
                dto.setUserName(user.getNickname());
            }

            // 设置学科名称
            Subject subject = subjectService.getById(material.getSubjectId());
            if (subject != null) {
                dto.setSubjectName(subject.getName());
            }

            // 设置学校名称
            if (material.getSchoolId() != null) {
                School school = schoolService.getById(material.getSchoolId());
                if (school != null) {
                    dto.setSchoolName(school.getName());
                }
            } else {
                dto.setSchoolName("所有学校");
            }

            dtoList.add(dto);
        }

        dtoPage.setRecords(dtoList);
        return dtoPage;
    }

    @Override
    public MaterialDTO getMaterialById(Long id) {
        Material material = getById(id);
        if (material == null || material.getIsDeleted() == 1) {
            return null;
        }

        MaterialDTO dto = new MaterialDTO();
        BeanUtils.copyProperties(material, dto);

        // 设置用户名
        User user = userService.getById(material.getUserId());
        if (user != null) {
            dto.setUserName(user.getNickname());
        }

        // 设置学科名称
        Subject subject = subjectService.getById(material.getSubjectId());
        if (subject != null) {
            dto.setSubjectName(subject.getName());
        }

        // 设置学校名称
        if (material.getSchoolId() != null) {
            School school = schoolService.getById(material.getSchoolId());
            if (school != null) {
                dto.setSchoolName(school.getName());
            }
        } else {
            dto.setSchoolName("所有学校");
        }

        return dto;
    }

    @Override
    public boolean addMaterial(MaterialDTO materialDTO) {
        Material material = new Material();
        BeanUtils.copyProperties(materialDTO, material);

        // 设置默认值
        material.setCreateTime(new Date());
        material.setUpdateTime(new Date());
        material.setIsDeleted(0);

        return save(material);
    }

    @Override
    public boolean updateMaterial(MaterialDTO materialDTO) {
        Material material = getById(materialDTO.getId());
        if (material == null || material.getIsDeleted() == 1) {
            return false;
        }

        BeanUtils.copyProperties(materialDTO, material);
        material.setUpdateTime(new Date());

        return updateById(material);
    }

    @Override
    public boolean deleteMaterial(Long id) {
        Material material = getById(id);
        if (material == null) {
            return false;
        }

        material.setIsDeleted(1);
        material.setUpdateTime(new Date());

        return updateById(material);
    }

    @Override
    public MaterialDTO generateAIMaterial(AIMaterialGenerateDTO generateDTO, Long userId) {
        MaterialDTO materialDTO = new MaterialDTO();
        materialDTO.setTitle(generateDTO.getTitle());
        materialDTO.setType(generateDTO.getType());
        materialDTO.setSubjectId(generateDTO.getSubjectId());
        materialDTO.setEducationLevel(generateDTO.getEducationLevel());
        materialDTO.setSchoolId(generateDTO.getSchoolId());
        materialDTO.setUserId(userId);

        // 获取学科名称用于生成内容
        Subject subject = subjectService.getById(generateDTO.getSubjectId());
        String subjectName = subject != null ? subject.getName() : "";

        // 生成AI内容
        String content = generateAIContent(
                generateDTO.getType(),
                subjectName,
                generateDTO.getEducationLevel(),
                generateDTO.getKeywords(),
                generateDTO.getDescription(),
                generateDTO.getContentLength(),
                generateDTO.getPrompt());

        materialDTO.setContent(content);

        // 生成默认封面URL
        if (generateDTO.getType() == 1) { // 课件
            materialDTO.setCoverUrl("https://example.com/default-courseware-cover.jpg");
            // 设置默认文件URL（对于课件类型）
            materialDTO.setFileUrl("https://example.com/default-courseware-file.pdf");
        } else { // 笔记
            materialDTO.setCoverUrl("https://example.com/default-note-cover.jpg");
            // 笔记类型不需要文件URL，但仍需要设置一个默认值
            materialDTO.setFileUrl("");
        }

        // 保存到数据库
        Material material = new Material();
        BeanUtils.copyProperties(materialDTO, material);

        // 设置默认值
        material.setCreateTime(new Date());
        material.setUpdateTime(new Date());
        material.setIsDeleted(0);

        boolean result = save(material);

        // 设置ID
        materialDTO.setId(material.getId());

        return materialDTO;
    }

    /**
     * 生成AI内容
     * 
     * @param type           类型：1-课件，2-笔记
     * @param subjectName    学科名称
     * @param educationLevel 教育阶段：1-小学，2-初中，3-高中，4-大学
     * @param keywords       关键词
     * @param description    详细描述
     * @param contentLength  内容长度：1-简短, 2-适中, 3-详细
     * @param prompt         额外的AI提示词
     * @return 生成的内容HTML
     */
    private String generateAIContent(Integer type, String subjectName, Integer educationLevel,
            String keywords, String description, Integer contentLength, String prompt) {
        // 在实际项目中，这里会调用大模型API生成内容
        // 这里使用模拟数据进行演示

        StringBuilder contentBuilder = new StringBuilder();

        // 根据类型生成不同的内容结构
        if (type == 1) { // 课件
            contentBuilder.append("<h1>" + subjectName + "课件：" + (keywords != null ? keywords : "学习资料") + "</h1>\n\n");

            // 添加目录
            contentBuilder.append("<h2>目录</h2>\n");
            contentBuilder.append("<ol>\n");
            contentBuilder.append("<li>引言</li>\n");
            contentBuilder.append("<li>基本概念</li>\n");
            contentBuilder.append("<li>主要内容</li>\n");
            contentBuilder.append("<li>知识点解析</li>\n");
            contentBuilder.append("<li>例题讲解</li>\n");
            contentBuilder.append("<li>小结</li>\n");
            contentBuilder.append("</ol>\n\n");

            // 引言
            contentBuilder.append("<h2>1. 引言</h2>\n");
            contentBuilder.append("<p>本课件主要围绕" + subjectName + "中的" + (keywords != null ? keywords : "重要知识点") +
                    "展开讲解，帮助学生掌握相关概念和应用。");
            if (description != null && !description.isEmpty()) {
                contentBuilder.append(" " + description);
            }
            contentBuilder.append("</p>\n\n");

            // 基本概念
            contentBuilder.append("<h2>2. 基本概念</h2>\n");
            contentBuilder.append("<p>在学习" + (keywords != null ? keywords : "本主题") + "之前，我们需要理解以下基本概念：</p>\n");
            contentBuilder.append("<ul>\n");
            contentBuilder.append("<li>概念1：示例定义</li>\n");
            contentBuilder.append("<li>概念2：示例定义</li>\n");
            contentBuilder.append("<li>概念3：示例定义</li>\n");
            contentBuilder.append("</ul>\n\n");

            // 其他部分
            contentBuilder.append("<h2>3. 主要内容</h2>\n");
            contentBuilder.append("<p>根据教育阶段和学科特点，本课件包含以下内容：</p>\n");
            contentBuilder.append("<p>这里是主要内容的详细描述，实际使用中将由AI根据提供的参数生成更加丰富和相关的内容。</p>\n\n");

        } else { // 笔记
            contentBuilder
                    .append("<h1>" + subjectName + "学习笔记：" + (keywords != null ? keywords : "知识点总结") + "</h1>\n\n");

            // 日期
            contentBuilder.append(
                    "<p><i>记录日期：" + new java.text.SimpleDateFormat("yyyy-MM-dd").format(new Date()) + "</i></p>\n\n");

            // 要点总结
            contentBuilder.append("<h2>要点总结</h2>\n");
            contentBuilder.append("<ul>\n");
            contentBuilder.append("<li>要点1：内容描述</li>\n");
            contentBuilder.append("<li>要点2：内容描述</li>\n");
            contentBuilder.append("<li>要点3：内容描述</li>\n");
            contentBuilder.append("</ul>\n\n");

            // 详细笔记
            contentBuilder.append("<h2>详细笔记</h2>\n");
            contentBuilder.append("<p>今天学习了" + (keywords != null ? keywords : "重要知识") + "，主要包括以下内容：</p>\n\n");

            contentBuilder.append("<h3>第一部分</h3>\n");
            contentBuilder.append("<p>这里是第一部分的笔记内容，实际使用中将由AI根据提供的参数生成更加丰富和相关的内容。</p>\n\n");
        }

        // 根据contentLength调整内容长度
        if (contentLength != null) {
            if (contentLength == 3) { // 详细
                contentBuilder.append("<h2>扩展内容</h2>\n");
                contentBuilder.append("<p>这里是更详细的内容，包括更多的例子、图表描述和应用场景。在实际使用中，AI将根据提供的参数生成更加详尽的内容。</p>\n\n");
                contentBuilder.append("<h3>深入理解</h3>\n");
                contentBuilder.append("<p>这部分内容将帮助学生深入理解相关概念和应用。</p>\n\n");
            } else if (contentLength == 1) { // 简短
                // 简短版本，内容已经足够
            }
        }

        // 添加结尾
        if (type == 1) { // 课件
            contentBuilder.append("<h2>6. 小结</h2>\n");
            contentBuilder.append("<p>通过本课件的学习，希望学生能够掌握" + (keywords != null ? keywords : "相关知识") +
                    "的基本概念和应用，为后续学习打下坚实基础。</p>\n");
        } else { // 笔记
            contentBuilder.append("<h2>学习感想</h2>\n");
            contentBuilder.append("<p>通过今天的学习，我对" + (keywords != null ? keywords : "这个主题") +
                    "有了更深入的理解。需要进一步复习和巩固的内容包括：...</p>\n");
        }

        return contentBuilder.toString();
    }
}